package com.chen.demo.javase.algorithm.leetcode.editor.cn;
//给定一个包含 m x n 个元素的矩阵（m 行, n 列），请按照顺时针螺旋顺序，返回矩阵中的所有元素。 
//
// 示例 1: 
//
// 输入:
//[
// [ 1, 2, 3 ],
// [ 4, 5, 6 ],
// [ 7, 8, 9 ]
//]
//输出: [1,2,3,6,9,8,7,4,5]
// 
//
// 示例 2: 
//
// 输入:
//[
//  [1, 2, 3, 4],
//  [5, 6, 7, 8],
//  [9,10,11,12]
//]
//输出: [1,2,3,4,8,12,11,10,9,5,6,7]
// 
// Related Topics 数组 
// 👍 578 👎 0

import java.util.LinkedList;
import java.util.List;

public class SpiralMatrix {
    public static void main(String[] args) {
        System.out.println(solution(new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}).toString());
        System.out.println(solution(new int[][]{{1}, {5}, {9}, {13}}).toString());
    }

    /**
     * 由外层到内层，逐层打印，注意只有一行或者一列的情况
     *
     * @param matrix m
     * @return 1
     */
    public static List<Integer> solution(int[][] matrix) {
        int left = 0;
        int right = matrix[0].length - 1;
        int top = 0;
        int bottom = matrix.length - 1;
        List<Integer> result = new LinkedList<>();
        while (left <= right && top <= bottom) {
            // System.out.printf("left:%s,right:%s,bottom:%s,top:%s%n", left, right, bottom, top);
            // 从左到右
            for (int column = left; column <= right; column++) {
                result.add(matrix[left][column]);
            }
            // 从上到下
            for (int row = top + 1; row <= bottom; row++) {
                result.add(matrix[row][right]);
            }
            // 只有一行
            if (top < bottom) {
                // 从右到左
                for (int column = right - 1; column >= left; column--) {
                    result.add(matrix[bottom][column]);
                }
            }
            // 只有一列，不执行
            if (left < right) {
                // 从下到上
                for (int row = bottom - 1; row > top; row--) {
                    result.add(matrix[row][left]);
                }
            }
            left++;
            right--;
            bottom--;
            top++;
            // System.out.println("end.");

        }
        return result;
    }


    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public List<Integer> spiralOrder(int[][] matrix) {
            return null;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}